home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / e / amigae33a.lha / E_v3.3a / Src.lha / Src / Gfx / Chunky3d / ls.e < prev    next >
Text File  |  1995-12-15  |  4KB  |  144 lines

  1. -> landscape test
  2.  
  3. OPT OSVERSION=39
  4.  
  5. CONST CWIDTH=256,CHEIGHT=128,CWSHIFT=8
  6. CONST SCHEIGHT=CHEIGHT+20
  7. CONST TEMPBUFS=CWIDTH*CHEIGHT/2,BUFS=CWIDTH*CHEIGHT,BUFM=$7FFF
  8. CONST SXOFF=50,SYOFF=80
  9.  
  10. MODULE '*c2p4', '*screenmodereq_db', 'tools/exceptions', 'tools/scrbuffer',
  11.        'intuition/screens', 'graphics/rastport', 'graphics/gfx',
  12.        'intuition/intuition'
  13.  
  14. PROC main() HANDLE
  15.   DEF dbs,scr=NIL:PTR TO screen,bm:PTR TO bitmap,win=NIL:PTR TO window,
  16.       tbuf2,tbuf3,tbuf2b,tbuf3b,cbuf,dbuf,dbuf2,lsbuf,sigbit,sig,safe=TRUE,a,x=0,y=0,
  17.       imsg:PTR TO intuimessage,temp
  18.   IF (dbs:=openreqscreen(CWIDTH,SCHEIGHT,4,'bla'))=NIL THEN Raise()
  19.   scr:=sb_GetScreen(dbs)
  20.   IF (win:=OpenW(0,0,CWIDTH-1,SCHEIGHT-1,
  21.     IDCMP_MOUSEBUTTONS OR IDCMP_MOUSEMOVE,
  22.     WFLG_REPORTMOUSE OR WFLG_BORDERLESS OR WFLG_SIMPLE_REFRESH OR WFLG_BACKDROP OR WFLG_ACTIVATE,
  23.     '',scr,15,NIL))=NIL THEN Raise("WIN")
  24.   tbuf2:=NewM(TEMPBUFS+TEMPBUFS,2)
  25.   tbuf3:=tbuf2+TEMPBUFS
  26.   tbuf2b:=NewM(TEMPBUFS+TEMPBUFS,2)
  27.   tbuf3b:=tbuf2b+TEMPBUFS
  28.   NEW cbuf[BUFS]
  29.   NEW dbuf[BUFS]
  30.   NEW dbuf2[BUFS]
  31.   NEW lsbuf[BUFS]
  32.   FOR a:=0 TO BUFS-1
  33.     dbuf[a]:=-1
  34.     dbuf2[a]:=-1
  35.   ENDFOR
  36.   FOR a:=0 TO 15 DO SetColour(scr,15-a,a*16,a*16,a*16)
  37.   mountain(cbuf)
  38.   CopyMem(cbuf,lsbuf,BUFS)
  39.   SetRast(scr.rastport,0)
  40.   IF (sigbit:=AllocSignal(-1))<>-1
  41.     sig:=Shl(1,sigbit)
  42.     REPEAT
  43.       render(cbuf,lsbuf,CWIDTH*y+x,80,80)
  44.       x:=x+2
  45.       y:=y+3
  46.       IF safe=FALSE
  47.         Wait(sig)
  48.         safe:=TRUE
  49.       ENDIF
  50.       bm:=sb_NextBuffer(dbs)
  51.       ->SetColour(scr,15,f:=255-f,f,f)
  52.       c2p4(tbuf3,tbuf2,cbuf,dbuf,bm.planes,FindTask(NIL),sig,gfxbase)
  53.       temp:=dbuf; dbuf:=dbuf2; dbuf2:=temp
  54.       temp:=tbuf2; tbuf2:=tbuf2b; tbuf2b:=temp
  55.       temp:=tbuf3; tbuf3:=tbuf3b; tbuf3b:=temp
  56.       IF imsg:=GetMsg(win.userport)
  57.         x:=0-imsg.mousex
  58.         y:=0-imsg.mousey
  59.         ReplyMsg(imsg)
  60.       ENDIF
  61.       safe:=FALSE
  62.     UNTIL Mouse()
  63.     IF safe=FALSE THEN Wait(sig)
  64.     FreeSignal(sigbit)
  65.   ENDIF
  66. EXCEPT DO
  67.   IF win THEN CloseWindow(win)
  68.   closereqscreen(dbs)
  69.   SELECT exception
  70.     CASE "SCR"; WriteF('no screen!\n')
  71.     CASE "REQ"; WriteF('Error: Could not allocate ASL request\n')
  72.     CASE "ASL"; WriteF('Error: Could not open ASL library\n')
  73.   ENDSELECT
  74.   report_exception()
  75. ENDPROC
  76.  
  77. PROC mountain(buf)
  78.   DEF a,x,y
  79.   FOR a:=0 TO BUFS-1
  80.     y:=a/CWIDTH; x:=Mod(a,CWIDTH)
  81.     buf[a]:=Bounds(
  82.        ((x-128)*(x-128))+((y-64)*(y-64))/300,
  83.        ->x*y/300,
  84.        ->!(!Fsin(x!/10.0)*3.0+3.0)+(!Fsin(y!/10.0)*3.0+3.0)!,
  85.        ->!Fsin(x!/10.0)*6.0*Fsin(y!/10.0)+5.0!,
  86.        0,15)
  87.   ENDFOR
  88. ENDPROC
  89.  
  90. PROC render(destbuf,lsbuf,offs,xs,ys)
  91.   DEF a,t1,t2
  92.   clearmem(destbuf,BUFS)
  93.   t1:=ys-1*CWIDTH-1+offs
  94.   t2:=xs-1+offs
  95.   FOR a:=1 TO xs DO line(a,t1+a AND BUFM,a+SXOFF,a/2+SYOFF,destbuf,lsbuf)
  96.   FOR a:=ys-1 TO 1 STEP -1 DO line(a,a-1*CWIDTH+t2 AND BUFM,xs*2+SXOFF-a,a/2+SYOFF,destbuf,lsbuf)
  97. ENDPROC
  98.  
  99. PROC clearmem(mem,size)
  100.   DEF e:REG,a:REG,b:REG,c:REG,d:REG
  101.   e:=size/16-1
  102.   a:=b:=c:=d:=$04040404
  103.   MOVE.L mem,A0
  104.   ADD.L size,A0
  105. clloop:
  106.   MOVEM.L a/b/c/d,-(A0)
  107.   DBRA e,clloop
  108. ENDPROC
  109.  
  110. PROC line(num,start,sx,sy,destbuf,lsbuf)
  111.   DEF a:REG,y,t:REG,c=0:REG,xoff:REG,yoff:REG
  112.   xoff:=sx+destbuf
  113.   yoff:=sy-25-num+1
  114.   y:=sy*CWIDTH+xoff
  115.   a:=num-1+yoff
  116.   MOVE.L start,D2        -> D2=start
  117.   MOVEA.L lsbuf,A3        -> A3=lsbuf
  118.   MOVE.L y,A2            -> A2=y
  119.   MOVE.L #CWIDTH,D1        -> D1=CWIDTH
  120.   MOVE.L #BUFM,D0        -> D0=BUFM
  121.   MOVE.L #CWIDTH+1,A1        -> A1=CWIDTH+1
  122. bloop:                -> this loop eats almost all cpu-time.
  123.   MOVE.B 0(A3,D2.L),c
  124.   MOVE.L a,t
  125.   ADD.L c,t
  126.   LSL.L #CWSHIFT,t
  127.   ADD.L xoff,t
  128.   CMP.L A2,t
  129.   BGE.S skip
  130.   BRA.S loop
  131. begi:
  132.   SUBA.L D1,A2
  133.   MOVE.B c,(A2)
  134. loop:
  135.   CMP.L A2,t
  136.   BMI.S begi
  137. skip:
  138.   SUB.L A1,D2
  139.   AND.L D0,D2
  140.   SUBQ.L #1,a
  141.   CMP.L yoff,a
  142.   BPL.S bloop
  143. ENDPROC
  144.